במדריך זה נכיר ונלמד על JSON ובין היתר על העבודה עם JSON בPHP ואף שילובו עם JS ועם AJAX .
שלום לכל הגולשים, במדריך הבא אלמד ואסביר מעט על JSON ועל עבודה עם JSON בPHP ואף באופן שניתן לשלבו בJS ובAJAX .
מה זה JSON ?
JSON הינו פורמט להעברת נתונים בצורה מאוד קלילה ונוחה .
JSON אלו הם ראשי התיבות של JavaScript Object Notation ולכן ישר מבינים שזה קשור בצורה כלשהי לJavaScript .
ובכן, JSON הוא אובייקט JS המכיל מפתחות עם ערכים מסוימים הקשורים להם .
מתחילים לעבוד עם JSON
ובכן, כמו שציינתי בהסבר, JSON הינו אובייקט JS הבנוי ממפתחות שמשויכים להם ערכים משלהם .
ובכן, בואו נראה דוגמה לאובייקט JSON:
{
"name": "Asaf",
"lastName": "Goldstein"
}
"name": "Asaf",
"lastName": "Goldstein"
}
האובייקט הנ"ל מתאר לנו שני מפתחות אשר להם יש ערכים .
בעוד שהמפתח name מחזיק בערך Asaf, המפתח lastName מחזיק בערך Goldstein .
כך מתארים אובייקט JSON !
כמו שניתן לשים לב, ראשית אנו מתחילים בסוגריים מסולסלות ולאחר מכן אנו רושמים שם של מפתח, לאחריו נקודתיים ואז את ערכו .
כמו כן ניתן להמשיך ולרשום עוד ועוד מפתחות וערכים כל עוד נפריד אותם בפסיק (כמו בדוגמה) .
נשאלת השאלה, כיצד ניתן לאחסן בתוך מפתח אחד מספר ערכים ?
ובכן, פשוט מאוד, נעשה זאת כך:
{
"name" : "Asaf",
"phone" : {
"mobilePhone" : "0500000000",
"officePhone" : "030000000"
}
}
"name" : "Asaf",
"phone" : {
"mobilePhone" : "0500000000",
"officePhone" : "030000000"
}
}
ראוי להדגיש, אם איננו מתכוונים לתת מפתחות לערכים הפנימיים שבתוך המפתח (במקרה הזה Mobile, Office במפתח Phone), אז עלינו לעשות זאת בצורת מערך ללא מפתחות, כך:
{
"name" : "Asaf",
"phone" : [
"0500000000",
"030000000"
]
}
"name" : "Asaf",
"phone" : [
"0500000000",
"030000000"
]
}
פונקציות עזר בPHP לעבודה עם JSON
ובכן, כדי לנתח ולהפוך JSON למערך וכן להפוך מערך למחרוזת JSON יש לנו שני כלים:
json_encode - הופכת מערך למחרוזת של אובייקט JSON .
הפונקציה מקבלת שני ארגומנטים, הראשון הינו חובה ואילו השני אופציונלי .
הראשון (חובה) יכיל את המערך שברצוננו להפוך למחרוזת של אובייקט JSON;
השני (אופציונלי) מכיל קבועים מסוגים שונים, שמטרתם היא להפוך תווים מסויימים (תלוי באיזה קבוע מדובר) להקסדצימלים .
json_decode - הופכת מחרוזת של אובייקט מסוג JSON לאובייקט/ מערך .
הפונקציה מקבלת ארבעה ארגומנטים, הראשון הינו חובה ואילו כל השאר הינם ארגומנטים אופציונליים .
הראשון (חובה) יכיל את מחרוזת הJSON שברצוננו להמיר למערך/ אובייקט .
השני (אופציונלי) יכיל TRUE אם ברצוננו שיוחזר לנו מערך אסוציאטיבי או FALSE (שזוהי ברירת המחדל במקרה שלא נמלא ארגומנט זה) במקרה שנרצה לקבל אובייקט .
השלישי (אופציונלי) יכיל מספר המסמל את העומק הרקורסיבי שבה הפונקציה תנתח את המחרוזת ותהפוך אותו לאובייקט/ מערך .
הרביעי (אופציונלי) יכיל קבוע מסוים; נכון להיום, אך ורק הקבוע JSON_BIGINT_AS_STRING נתמך (הופך מספרים גדולים (כדוגמת 12345678901234567890) למחרוזות .
דוגמאות שימוש בפונקציות השונות לJSON בPHP
נחזור לדוגמה הראשונה שהבאנו בדף, כעת בואו ננתח את המחרוזת הנ"ל ונהפוך אותה לאובייקט ולאחר מכן נדפיס את המפתחות שלנו:
$foo = '
{
"name": "Asaf",
"lastName": "Goldstein"
}';
$foo = json_decode( $foo );
echo 'My Name is ' . $foo->name . ' ' . $foo->lastName; // outputs 'My Name is Asaf Goldstein';
{
"name": "Asaf",
"lastName": "Goldstein"
}';
$foo = json_decode( $foo );
echo 'My Name is ' . $foo->name . ' ' . $foo->lastName; // outputs 'My Name is Asaf Goldstein';
כעת, בואו נחזור לדוגמה השנייה שלנו והפעם נהפוך את מחרוזת אובייקט הJSON שם למערך ונדפיס אותו (עם כמה תוספות כמו מקודם):
$foo = '
{
"name" : "Asaf",
"phone" : {
"mobilePhone" : "0500000000",
"officePhone" : "030000000"
}
}';
$foo = json_decode( $foo, TRUE );
echo 'My Name is ' . $foo['name'] . '<br />'; // outputs 'My name if Asaf<br />';
echo 'My mobile phone number is ' . $foo['phone']['mobilePhone'] . '<br />'; // outputs 'My mobile phone number is 0500000000<br />'
echo 'My office phone number is ' . $foo['phone']['officePhone']; // outputs 'My office phone number is 030000000'
{
"name" : "Asaf",
"phone" : {
"mobilePhone" : "0500000000",
"officePhone" : "030000000"
}
}';
$foo = json_decode( $foo, TRUE );
echo 'My Name is ' . $foo['name'] . '<br />'; // outputs 'My name if Asaf<br />';
echo 'My mobile phone number is ' . $foo['phone']['mobilePhone'] . '<br />'; // outputs 'My mobile phone number is 0500000000<br />'
echo 'My office phone number is ' . $foo['phone']['officePhone']; // outputs 'My office phone number is 030000000'
ובואו נראה למה תהפוך לנו מחרוזת אובייקט הJSON הבאה (ללא מפתחות):
$foo = '
{
"name" : "Asaf",
"phone" : [
"0500000000",
"030000000"
]
}';
$foo = json_decode( $foo );
echo 'My Name is ' . $foo->name . '<br />'; // outputs 'My name if Asaf<br />';
echo 'My mobile phone number is ' . $foo->phone[0] . '<br />'; // outputs 'My mobile phone number is 0500000000<br />'
echo 'My office phone number is ' . $foo->phone[1]; // outputs 'My office phone number is 030000000'
{
"name" : "Asaf",
"phone" : [
"0500000000",
"030000000"
]
}';
$foo = json_decode( $foo );
echo 'My Name is ' . $foo->name . '<br />'; // outputs 'My name if Asaf<br />';
echo 'My mobile phone number is ' . $foo->phone[0] . '<br />'; // outputs 'My mobile phone number is 0500000000<br />'
echo 'My office phone number is ' . $foo->phone[1]; // outputs 'My office phone number is 030000000'
כעת, לאחר שהבאתי דוגמאות לשימוש בפונקציה json_decode נבחן ונראה דוגמאות ושימושים בפונקציה json_encode .
בואו נהפוך את המערך הבא למחרוזת JSON (שתציג לנו בדיוק מה שעשינו בדוגמה הראשונה:
$foo = array(
'name' => 'Asaf',
'lastName' => 'Goldstein'
);
echo json_encode($foo); // outputs {"name":"Asaf","lastName":"Goldstein"}
'name' => 'Asaf',
'lastName' => 'Goldstein'
);
echo json_encode($foo); // outputs {"name":"Asaf","lastName":"Goldstein"}
כעת, בואו ונלך לדוגמה השנייה שהראנו והפעם נהפוך את המערך הבא למחרוזת מסוג אובייקט JSON:
$foo = array(
'name' => 'Asaf',
'phone' => array(
'mobilePhone' => '0500000000',
'officePhone' => '030000000'
)
);
echo json_encode($foo); // outputs {"name":"Asaf","phone":{"mobilePhone":"0500000000","officePhone":"030000000"}}
'name' => 'Asaf',
'phone' => array(
'mobilePhone' => '0500000000',
'officePhone' => '030000000'
)
);
echo json_encode($foo); // outputs {"name":"Asaf","phone":{"mobilePhone":"0500000000","officePhone":"030000000"}}
וכעת, בואו נראה מה קורה כאשר למערך הנמצא בתוך המפתח phone אין מפתחות, אלא רק ערכים:
$foo = array(
'name' => 'Asaf',
'phone' => array(
'0500000000',
'030000000'
)
);
echo json_encode($foo); // outputs {"name":"Asaf","phone":["0500000000","030000000"]}
'name' => 'Asaf',
'phone' => array(
'0500000000',
'030000000'
)
);
echo json_encode($foo); // outputs {"name":"Asaf","phone":["0500000000","030000000"]}
שילוב של JSON ביחד עם AJAX
כעת, אסביר לכם כיצד ניתן לשלב JSON בJS בעזרת AJAX .
נכין את דף הPHP שלנו שאמור לנתח לנו את הנתונים:
<?php
/**
* Get user data with JSON and AJAX
*
* @author JBStyle
* @copyright 2011
*/
$foo = array(
1 => array(
'name' => 'Daniel',
'lastName' => 'Levi'
),
2 => array(
'name' => 'Joey',
'lastName' => 'Scott'
)
);
echo json_encode( $foo ); // {"1":{"name":"Daniel","lastName":"Levi"},"2":{"name":"Joey","lastName":"Scott"}}
?>
/**
* Get user data with JSON and AJAX
*
* @author JBStyle
* @copyright 2011
*/
$foo = array(
1 => array(
'name' => 'Daniel',
'lastName' => 'Levi'
),
2 => array(
'name' => 'Joey',
'lastName' => 'Scott'
)
);
echo json_encode( $foo ); // {"1":{"name":"Daniel","lastName":"Levi"},"2":{"name":"Joey","lastName":"Scott"}}
?>
כעת נכין את סקריפט הAJAX שינתח ויציג לנו את השם ושם המשפחה של כל אחד מהאנשים שבמחרוזת האובייקט ששלחנו לו בדף הPHP- (Joey, Daniel)
$(document).ready(function(){
$.getJSON( 'userNamesJSON.php', function(jsonData){
alert( jsonData[1].lastName ) // Levi
alert( jsonData[2].name ); // Joey
});
});
$.getJSON( 'userNamesJSON.php', function(jsonData){
alert( jsonData[1].lastName ) // Levi
alert( jsonData[2].name ); // Joey
});
});
בדוגמה למעלה השתמשתי בפונקציה הקיימת בספריית JS הנקראת JQUERY (באופן אישי אני ממליץ בחום על הספרייה, יש לה נוחות וגמישות נהדרת למפתח) .
כמו כן ניתן לעשות זאת בצורה רגילה כך:
var xmlHttpConnection, jsonData;
//===========================================
// For Firefox, Chrome, Safari, Opera, IE7+
//===========================================
if ( window.XMLHttpRequest )
{
xmlHttpConnection = new XMLHttpRequest();
}
//===========================================
// For IE5, IE6 and some other old browsers
//===========================================
else
{
xmlHttpConnection = new ActiveXObject('Microsoft.XMLHTTP');
}
//===========================================
// Displays the names
//===========================================
function showNames()
{
if ( xmlHttpConnection.readyState == 4 && xmlHttpConnection.status == 200 )
{
jsonData = JSON.parse(xmlHttpConnection.responseText);
alert( jsonData[1].lastName ) // Levi
alert( jsonData[2].name ); // Joey
}
}
xmlHttpConnection.open('POST', 'userNamesJSON.php', true);
xmlHttpConnection.setRequestHeader( 'Content-Type', 'application/json' );
xmlHttpConnection.send();
xmlHttpConnection.onreadystatechange = showNames;
//===========================================
// For Firefox, Chrome, Safari, Opera, IE7+
//===========================================
if ( window.XMLHttpRequest )
{
xmlHttpConnection = new XMLHttpRequest();
}
//===========================================
// For IE5, IE6 and some other old browsers
//===========================================
else
{
xmlHttpConnection = new ActiveXObject('Microsoft.XMLHTTP');
}
//===========================================
// Displays the names
//===========================================
function showNames()
{
if ( xmlHttpConnection.readyState == 4 && xmlHttpConnection.status == 200 )
{
jsonData = JSON.parse(xmlHttpConnection.responseText);
alert( jsonData[1].lastName ) // Levi
alert( jsonData[2].name ); // Joey
}
}
xmlHttpConnection.open('POST', 'userNamesJSON.php', true);
xmlHttpConnection.setRequestHeader( 'Content-Type', 'application/json' );
xmlHttpConnection.send();
xmlHttpConnection.onreadystatechange = showNames;
סקירות ויעילויות
- רצוי להשתמש רק בפרמטר אחד בjson_decode (ואז לקבל אובייקט), פונקציה זו עובדת יותר מהר עם פרמטר אחד .
- JSON נמצא מהיר יותר מאשר XML .
- JSON נעים לקרוא ולכתוב .
- JSON פשוט וקל ללמוד .
מקווה שלמדתם והשכלתם מעט על JSON וכעת תתחילו להשתמש בו :)
תגובות לכתבה:
ראשית, תודה רבה על המדריך.
אני יוסיף שדי מזמן עברתי להשתמש ב json כדי לשמור הגדרות מערכך במקום xml לדברים או רשומים ישירות בקוד.
גם עקב מהירותו הרבה יותר, גודלו הקטן יותר ונוחות השימוש הענקית שלו.
שוב תודה, יהונתן :)
אכן נכון הדבר והזכרתי אותו גם בתחתית המאמר .
JSON הוא דבר נהדר לעשיית דברים מעין אלו :)
יפה מאוד!
תודה על המאמר..
האם אתה היית בעבר כותב ב-VB-DR?
KingYes.
לא, זוהי הכתבה הראשונה שלי בנוגע לתכנות ברשת ח .
נחמד מאוד :]
ראשית תודה על המאמר הנוכחי, ועל כל המאמרים באתר.
תיקון טעות: במקום "אובייקט אסוציאטיבי"
צריך להופיע "מערך אסוציאטיבי".
שוב תודה
תודה על ההערה, לא שמתי לב (מרוב שכתבתי יותר מדי אובייקט בפסקה שם ח) .
אני חושב שהבינו אבל את הכוונה לא ?
בעבר פרסמתי מדריך קטן על json: http://phpguide.co.il/Javacscript_כותבים_OOP_בעזרת_JSON.htm
אני לא ידעתי שיש את זה גם ב-php,
תודה רבה. :)
יש לי את הJSON הבא:
{
"1":{
"name":"111",
"longName":"2222",
}
"2":{
"name":"asa",
"longName":"2342",
}
}
איך אני ניגש לשם של אינדקס 1 עם PHP?
אם תשאל את אותה שאלה בפורום, שבו אי אפשרות עיצוב קוד - יהיה לנו הרבה יותר קל להבין מה הולך שום ולתת לך תשובה.